
// FN 是类型还是值 
// type : 类型别名
// 此时FN就变成了一个类型 用类型别名来修饰
type FN = ()=>string
// 值 既可以是string 又可以是boolean 
//  : | 或  
// 首字母大写
// 联合类型
type NumberOrString = number | string;

interface IObg {
  a:boolean
}
// 函数类型
type FNN = (obj:IObg)=>never
interface InnerParas {
  name:string
}
interface IPMas {
  abc:InnerParas
}
type FAndI = IPMas | FNN;  //函数 : 参数是一个对象{a:boolean} 返回值 never |  接口 : {abc:{name:string}}

function abc1(fn :FN ,params :NumberOrString):void{
}

let x : FAndI  

x = (obj:IObg):never=>{throw new Error('')}
x = {abc :{name:'string'} }

abc1(()=>'string', '123' )


// 元组类型 : 数组
// 数组每个值的类型
let tuble : [number,string]
tuble = [10,'234']

// [{data:[{name:'张三'},{name:'李四'},{name:'王五'}]},3]  数据+ 数据的条数
interface InnerDataType {
  name:number
}
interface IDataType  {
  data : Array<InnerDataType>
}
type IReturnTypee = [IDataType,number]

let data :IReturnTypee ;
data = [{data:[{name:123}]},10]

data[0].data.map(item=>item.name.toFixed(2))

// 枚举类型 
// 状态码 404 200 401(未授权) 403 (没有权限)

// 枚举关键字 enum

// 类型
enum EYear{
  No1,
  No2,
  No3,
  No4
}

let years: EYear

years = EYear.No1

// 输入一个季度 如果是第一季度 打印1
function getYEARS (y : EYear){
  if(y === EYear.No1){
    console.log(EYear.No1)
  }
}

// 应用场景 : react redux : action :  {type : }

getYEARS(EYear.No1)



// type : 类型别名 
// 元组 : 约束数组的每一项的类型 应用场景 : 返回的数据 
// 枚举 : 固定的选项 一周有7天 状态码404 200 redux action 

// [
// {name:'zhangsan',age:20} ,  // age : 可选项
// {name:'zhangsi'},
// {name:'zhangwu',sex:true}  // sex 可选项 
// ]
//  ? : 有没有  可选类型 
interface InnerData {
  name : string,
  age? : number,
  sex?: boolean
}
type IData = Array<InnerData>

let data1 : IData = [
  {name:'zhangsan',age:20} ,
  {name:'zhangsi'},
  {name:'zhangwu',sex:true} 
  ]

// number string boolean Array<类型> 对象:接口约束 可选类型? 函数 : (a:string)=>类型
// 类型别名 : 联合类型  元组 : 约束数组 枚举 : 固定的项

// 作业 : 

// 1. 实现枚举的方式的状态码 包含200 401 403 404 500 
// 2. 实现一个函数参数是第一题的状态码枚举类型 返回值是true或者false (如果200是true 其他的是false)
// 3. 实现一个类型别名包含既可以是string 也可以是 number
// 4. 实现一个元组类型的变量 第一项的类型是{success:boolean,data:{[{name:string,age和pickName是可选}]}} 第二项是number
// 5. 实现一个函数 类型是函数(参数是接口) 最终的调用效果是
// let res = abc({name:'zhang',link:['http://www.baidu,con',1]}) // res.map(item=>item.count%2!==0) 不会报错


// 验证正则 
// 正则 : /^[a-zA-Z0-9]{6,12}$/
// 验证手机号 : /^1[3-9]\d{9}$/
// 验证邮箱 : /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/
